5장. 점 잇기 RAG — 흩어진 사실을 그래프로 엮는다

출처: 『RAG 마스터: 랭체인으로 완성하는 LLM 서비스』(브라이스 유·조경아·박수진·김재웅 지음, 프리렉 2025) | 공식: www.langchain.com

이 장은 마이크로소프트 GraphRAG 연구를 바탕으로 씌어졌다.

코드는 분위기만 — pip install·MATCH·MERGE 같은 말은 몰라도 됩니다. 표의 '비유'와 '위험'만 봐도 충분해요.


0. 이 장의 새 단어 (0장에 없는 것만 3개)

0장 용어집에 있는 말(LLM·RAG·임베딩·벡터·청크·검색기·코사인 유사도·랭체인 등)은 거기서 확인하세요.

여기서는 5장에 처음 나오는 말 3개만 풀어 둡니다.

본문 어디서 막혀도 이 3개로 충분합니다.


지식 그래프(knowledge graph)

한 문장 뜻 — '누가 무엇과 어떤 관계인지'를 점과 선으로 그려, 사실들을 이어 붙인 그림.

일상비유 — 형사 사무실 벽에 붙은 인물 관계도. 사진(점)과 사진을 실(선)로 잇고, 실 위에 '친구'·'상사'라고 적어 둔 것.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 점(개체) ─선(관계)→ 점(개체)
# "애플" ─(개발)→ "아이폰"

여기서 점을 노드, 선을 에지라고 부릅니다.

노드는 사람·회사·제품 같은 대상, 에지는 그 둘 사이의 관계입니다.


커뮤니티(community)

한 문장 뜻 — 관계도 안에서 서로 빽빽하게 얽힌 점들의 무리.

일상비유 — 단체 사진 속 친한 패거리. 자기들끼리는 어깨동무로 다닥다닥, 다른 무리와는 띄엄띄엄.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 애플·아이폰·맥북 → "애플 제품" 무리
# 구글·안드로이드·픽셀 → "구글 제품" 무리

무리별로 한 줄 요약을 미리 적어 두면, 나중에 찾기가 빨라집니다.


Neo4j / Cypher

한 문장 뜻 — Neo4j는 점과 선을 그대로 담는 그래프 전용 창고. Cypher는 그 창고에 "이런 점 찾아줘"라고 묻는 전용 말투.

일상비유 — Neo4j는 인물 관계도를 통째로 보관하는 캐비닛. Cypher는 "철수랑 선 하나로 이어진 사람 다 꺼내줘"라고 사서에게 거는 주문.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# Cypher: 테슬라와 한 다리로 이어진 점들 꺼내기
# MATCH (테슬라)-[:관계]-(이웃)  RETURN 이웃

(귀납 도입) 이런 적 있죠?

회사 자료를 잔뜩 넣은 RAG에게 물었습니다.

"우리 회사가 지난 10년간 친환경 전략을 어떻게 바꿔 왔어?"

RAG는 연도별 보고서 조각을 몇 개 찾아 왔습니다.

2015년 조각 하나, 2020년 조각 하나, 2023년 조각 하나.

그런데 답이 이상합니다.

조각들이 따로따로 나열될 뿐, "어떻게 변해 왔는지"는 말해 주지 못합니다.

왜 그럴까요?

기존 RAG는 0장에서 배운 대로 비슷한 문서 조각을 찾는 데 강합니다.

하지만 조각끼리 어떻게 이어지는지는 보지 못합니다.

조각 A와 조각 B가 같은 인물을 다루는지, 시간순으로 어떻게 연결되는지 — 그 연결선이 RAG의 머릿속엔 없습니다.

저자는 두 가지 막히는 장면을 듭니다.

# 막힘 1 — 조각은 찾는데 연결을 못 본다
# 준비한 흐름에 실제 입력을 넣어 결과를 확인합니다.
rag.invoke("이 문서 전체의 주요 주제는?")
# → 개별 조각만 나옴. 전체를 아우르는 큰 그림 X

# 막힘 2 — 데이터가 클수록 더 못 본다
# 준비한 흐름에 실제 입력을 넣어 결과를 확인합니다.
rag.invoke("10년치 보고서로 전략 변화를 설명해줘")
# → 조각들이 서로 어떻게 이어지는지 추적 못 함

그래서 나온 발상이 이겁니다.

문서를 조각으로만 두지 말고, 점과 선으로 엮어 두자.

"스티브 잡스"라는 점에서 선을 따라가면 "애플"이 나오고, 또 다른 선을 따라가면 "픽사"가 나옵니다.

이렇게 선을 따라가며 답하는 방식 — 그게 그래프 RAG입니다.

벡터 RAG가 '비슷한 조각 찾기'라면, 그래프 RAG는 '연결된 점 따라가기'입니다.


이 장에서 딱 6가지만

TL;DR

그래프 RAG가 왜 필요한가 — 기존 RAG는 조각은 찾아도 조각끼리의 연결전체 그림을 못 본다.

지식 그래프 — 점(노드)과 선(에지)에 '의미'를 붙여 사실을 엮은 그림. 추론까지 된다.

그래프 DB 만들기 4단계 — 자르기 → 점·선 뽑기 → 무리 짓고 숫자로 → 무리 요약.

점·선 뽑는 도구들 — 규칙·기계학습·딥러닝·LLM. 요즘은 LLM이 주류.

로컬 검색 vs 글로벌 검색 — 콕 집은 질문은 로컬, 전체 주제 질문은 글로벌(맵-리듀스).

Neo4j + 랭체인 — 점·선을 창고(Neo4j)에 넣고, 말로 물으면 Cypher로 자동 번역(GraphCypherQAChain).

각 묶음을 한 섹션씩 풉니다.

천천히 가도 됩니다.


개념 1 — 그래프 RAG가 왜 필요한가 (기존 RAG의 두 한계)

망가지는 장면

도서관 사서에게 책 제목만 대면 비슷한 책을 잘 찾아 줍니다.

그런데 "이 서가 전체가 공통적으로 말하는 게 뭐예요?"라고 물으면 사서가 멈칫합니다.

책 한 권 한 권은 알아도, 전체를 꿰는 줄기는 모르기 때문입니다.

기존 RAG가 딱 이 사서입니다.

일상비유

조각 그림 퍼즐을 한 조각씩 보여 주는 사람.

한 조각엔 바퀴, 다른 조각엔 창문이 그려져 있습니다.

조각만 봐선 "이게 자동차구나"를 모릅니다.

조각들을 이어 붙여야 전체 그림이 보입니다.

비유 코드 위험
퍼즐 조각만 보여줌 rag.invoke("문서 전체 주제는?") 한계 1 — 조각 연결을 못 봐 전체 주제 못 잡음
책 한 권씩만 앎 rag.invoke("10년 전략 변화는?") 한계 2 — 데이터 클수록 흐름 추적 불가

저자는 기존 RAG의 한계를 둘로 정리합니다.

한계 1 — 정보 연결의 어려움. 개별 조각은 찾지만, 조각끼리 어떻게 연결돼 전체 의미를 이루는지 모릅니다.

한계 2 — 대규모 데이터 이해의 한계. 자료가 많아질수록 "전체에서 무슨 패턴이 흐르는가"를 못 봅니다.

한 문장 정의 — 그래프 RAG는 조각을 점과 선으로 엮어, 기존 RAG가 놓치는 연결전체 그림을 보게 하는 방식이다.

예시 폭격

예시 ①(완성 — 따라 읽기). 질문 "이 사업보고서의 주요 주제는?"

기존 RAG: 사업 영역 조각 + 재무 조각을 따로 던져 줌. 둘이 어떻게 엮이는지 X.

그래프 RAG: '회사'라는 점에서 '사업'·'재무' 선을 따라가 엮인 그림을 보여 줌.

예시 ②(부분 완성 — 빈칸 채우기). 질문 "지난 10년 친환경 전략 변화는?"

기존 RAG는 연도별 조각을 ( ㉠ )로 던진다 → 흐름 X.

그래프 RAG는 연도를 ( ㉡ )으로 이어 변화를 추적한다.

정답 ㉠ 따로따로 / ㉡ 선(관계)

예시 ③(독립 적용 — 혼자). 다음 질문 중 그래프 RAG가 유리한 것에 표시해 보세요.

(가) "이 제품 출시일은?" (나) "이 보고서 전체를 관통하는 핵심 주제는?"

힌트: 콕 집은 사실은 기존 RAG로도 충분, 전체를 꿰는 건 그래프 RAG. → 답 (나)

미니 시나리오

"우리 회사 문서들 사이의 숨은 연관을 찾고 싶다" → 그래프 RAG를 떠올린다.

"그냥 이 단어 들어간 문단만 찾으면 된다" → 기존 RAG로 충분하다.


개념 2 — 지식 그래프 (점·선에 '의미'를 붙이면)

망가지는 장면

점 두 개를 선으로 이었습니다. "애플 — 아이폰".

그런데 이 선이 무슨 뜻일까요?

애플이 아이폰을 만들었다? 팔았다? 베꼈다?

선만 그어 두면 관계의 뜻을 알 수 없습니다.

일상비유

이름표 없는 가족사진 vs 이름표 붙인 가족사진.

이름표가 없으면 누가 누구의 부모인지 모릅니다.

선 위에 '부모'·'형제'라고 적어 두면 비로소 관계가 읽힙니다.

비유 코드 위험
이름표 없는 선 애플 — 아이폰 (일반 그래프) 무슨 관계인지 모름
이름표 붙인 선 애플 ─(개발)→ 아이폰 (지식 그래프) 뜻이 없으면 기계가 활용 못 함

일반 그래프는 "이어져 있다"만 말합니다.

지식 그래프는 선에 이름(관계의 종류)을, 점에 속성을 붙입니다.

'아이폰' 점에는 출시일·운영체제·크기를, '개발' 선에는 시기·조건을 적어 둘 수 있습니다.

한 문장 정의 — 지식 그래프는 점과 선에 의미와 속성을 붙여, 사실을 기계가 읽고 추론할 수 있게 엮은 그림이다.

저자가 꼽는 지식 그래프의 세 가지 힘.

  1. 복잡한 정보 표현 — 점·선에 속성을 잔뜩 달 수 있다.
  2. 추론 — 직접 안 이어진 점도 경유해서 관계를 유추한다.
  3. 효율적 검색 — 한 점에서 선을 따라 이웃 점을 쏙쏙 꺼낸다.

예시 폭격

예시 ①(완성 — 추론의 힘). 두 사실: "스티브 잡스 ─(공동창업)→ 애플", "스티브 잡스 ─(CEO)→ 픽사".

각각만 보면 애플과 픽사는 무관해 보입니다.

하지만 '스티브 잡스' 점을 경유하면 → 애플과 픽사의 숨은 연관이 보입니다.

예시 ②(부분 완성). 점 '테슬라'에 속성을 답니다.

# 점에 속성 붙이기
# 여러 값을 이름표가 붙은 구조로 묶어 전달합니다.
"테슬라" = {"타입": "ORGANIZATION", "설명": "전기차·태양광 패널 생산"}
# 여러 값을 이름표가 붙은 구조로 묶어 전달합니다.
"일론 머스크" = {"타입": "( ㉠ )", "설명": "테슬라 설립자"}

정답 ㉠ PERSON

예시 ③(독립 적용). 문장 "구글은 안드로이드를 만들었다"를 점·선으로 그려 보세요.

답 예: 구글 ─(개발)→ 안드로이드. 점 2개(구글·안드로이드), 선 1개(개발).

미니 시나리오

"A와 C가 직접 안 엮였는데도 연관을 찾고 싶다" → 중간 점 B를 경유하는 추론을 쓴다.

"점에 출시일·가격까지 달아 두고 싶다" → 지식 그래프의 속성 기능을 쓴다.


개념 3 — 그래프 DB 만들기 4단계

망가지는 장면

긴 문서 한 뭉치를 통째로 LLM에 던지며 "점·선 다 뽑아 줘" 했습니다.

너무 길어 LLM이 헐떡이고, 빠뜨린 점도 수두룩합니다.

게다가 같은 인물이 문서마다 다르게 나와 점이 중복됩니다.

순서 없이 한 번에 하려니 엉망이 됩니다.

일상비유

김장 담그기.

배추 통째로 버무리지 않습니다. ① 썰고 ② 속을 넣고 ③ 버무리고 ④ 통에 담아 익힙니다.

순서대로 해야 제대로 됩니다. 그래프 만들기도 4단계 순서가 있습니다.

비유 코드(분위기) 위험
① 배추 썰기 문서 분할(청크) 너무 크게 자르면 점을 놓침
② 속 넣기 점·선 추출 LLM 출력이 들쭉날쭉
③ 버무리기 그래프 증강(무리+숫자) 중복 안 합치면 지저분
④ 담아 익히기 커뮤니티 요약 요약 없으면 검색 느림

4단계를 차례로 봅니다.

단계 1 — 문서 분할. 긴 글을 청크로 자릅니다(0장 '청크' 참고).

작게 자를수록 점을 더 많이 잡지만, 비용이 늘어납니다.

저자가 인용한 연구: 600토큰으로 자르면 2400토큰보다 점을 거의 두 배 잡았습니다.

단계 2 — 점·선 추출. 각 청크에서 점(이름·타입·설명)과 선(출발·도착·설명·강도)을 뽑습니다.

여기서 Gleaning(이삭 줍기) 기법이 등장합니다. (개념 4에서 자세히)

단계 3 — 그래프 증강. 점들을 무리(커뮤니티)로 묶고, 그래프를 숫자(임베딩)로도 바꿉니다. (개념 5에서 자세히)

단계 4 — 커뮤니티 요약. 각 무리의 핵심을 한 줄 요약으로 적어 둡니다.

이 요약이 나중에 검색을 빠르게 해 줍니다.

한 문장 정의 — 그래프 DB는 자르기 → 점·선 뽑기 → 무리 짓고 숫자로 → 무리 요약 4단계를 거쳐 만든다.

예시 폭격

예시 ①(완성 — 점·선 뽑기). 문장 "테슬라는 일론 머스크가 설립한 회사로, 전기차를 생산합니다."

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 뽑힌 점(엔티티)
# - 테슬라 (ORGANIZATION, 전기차 생산 기업)
# - 일론 머스크 (PERSON, 테슬라 설립자)
# - 전기차 (PRODUCT, 테슬라 주력 제품)
# 뽑힌 선(관계)
# - 일론 머스크 ─(설립, 강도 9)→ 테슬라
# - 테슬라 ─(생산, 강도 8)→ 전기차

예시 ②(부분 완성 — 중복 합치기). 같은 점이 두 번 나왔습니다.

"일론 머스크: 트위터를 인수한 사람" + "일론 머스크: 스페이스X를 세운 사람"

→ 합치면 설명이 ( ㉠ )로 모이고, LLM이 한 문장으로 ( ㉡ )합니다.

정답 ㉠ 배열(목록) / ㉡ 요약 → "스페이스X를 세우고 트위터를 인수한 사람"

예시 ③(독립 적용). 청크 크기를 1200 → 600으로 줄이면 점 개수와 비용은 각각 어떻게 될까요?

답: 점 개수 ↑(거의 두 배), 비용 ↑(LLM 호출 늘어 더 비쌈).

미니 시나리오

"비용이 빠듯하다" → 청크를 크게(2400) 잡고 Gleaning으로 보완한다.

"점을 최대한 많이 잡고 싶다" → 청크를 작게(600) 잡는다.

한 걸음 더 ▸ (지금 몰라도 됨)

점·선을 뽑은 뒤 주장(Claim)도 따로 뽑을 수 있습니다. "일론 머스크가 2022년 트위터를 440억 달러에 인수" 같은 시간·상태가 붙은 사실입니다. 이런 주장은 '공변량'이라는 이름으로 따로 저장돼, 시점이 중요한 질문에 쓰입니다. 지금은 "선택사항이구나" 정도면 충분합니다.


개념 4 — 점·선 뽑는 도구들 (규칙·기계학습·딥러닝·LLM)

망가지는 장면

"회사명 + 은/는 + 제품명 + 을 출시했다" 같은 을 만들어 점·선을 뽑기로 했습니다.

"삼성전자는 갤럭시를 출시했다"는 잘 잡힙니다.

그런데 "삼성, 새 폰 공개"는 틀에 안 맞아 놓칩니다.

말투가 조금만 달라져도 줄줄 새는 겁니다.

일상비유

붕어빵 틀.

정해진 모양은 잘 찍지만, 별 모양 반죽이 오면 못 찍습니다.

틀이 빡빡할수록 변형에 약합니다. 그래서 점점 더 똑똑한 도구로 갈아탑니다.

비유 도구 위험
붕어빵 틀 규칙 기반 틀 밖 문장은 다 놓침
경험 많은 직원 기계학습(SVM·CRF) 복잡한 문장엔 약함
책 많이 읽은 전문가 딥러닝(BERT) 학습에 큰 데이터·자원
박학다식한 친구 LLM(GPT 등) 비싸고 느림, 출력 들쭉날쭉

네 도구를 정리합니다.

규칙 기반 — 정해진 패턴으로 뽑음. 단순·명확하지만 틀 밖은 못 잡음.

기계학습(SVM·CRF) — 단어 특징·문맥으로 뽑음. 규칙보다 낫고 자원도 가벼움. 단 복잡한 문장엔 약함.

딥러닝(BERT) — 깊은 문맥 이해. 단 학습에 큰 데이터·고사양 필요.

LLM(GPT 등) — 요즘 주류. 정확하고 전처리도 거의 없이 빠르게 만듦. 단 API 비용·속도·일관성이 약점.

LLM에게는 "이름·타입·설명을 뽑고, 관계를 1~10 강도로 표시해 줘" 식의 지시문(0장 '프롬프트' 참고)을 줍니다.

한 문장 정의 — 점·선 뽑기는 규칙 → 기계학습 → 딥러닝 → LLM 순으로 똑똑해졌고, 요즘은 LLM이 주류다.

이제 Gleaning(이삭 줍기) 입니다.

LLM이 한 번에 다 못 잡습니다. 그래서 한 번 더 훑어 빠진 점을 줍습니다.

추수 끝난 밭에서 떨어진 이삭을 다시 줍는 것과 같다고 해서 '이삭 줍기'입니다.

저자가 인용한 연구: 600토큰 청크에서 이삭 줍기를 세 번 하니 처음보다 점을 약 세 배(~28,000개) 잡았습니다.

예시 폭격

예시 ①(완성 — 규칙의 한계). 패턴 "회사명 + 은/는 + 제품명 + 을 출시했다".

"삼성전자는 갤럭시 S23을 출시했다" → 잘 잡힘.

"삼성, S23 공개" → 패턴 불일치 → 놓침.

예시 ②(부분 완성 — 이삭 줍기). 1차 추출에서 점 100개를 잡았습니다.

이삭 줍기를 1회 더 하면 빠진 점을 ( ㉠ )하고, 반복할수록 점이 ( ㉡ )납니다.

정답 ㉠ 보완 / ㉡ 늘어

예시 ③(독립 적용). 비용은 최대한 줄이되 점은 많이 잡고 싶습니다. 어떤 조합?

답 예: 청크를 크게(비용 ↓) + Gleaning 횟수 늘리기(점 보완). 큰 청크의 약점을 이삭 줍기로 메움.

미니 시나리오

"출력이 자꾸 빠뜨린다" → Gleaning 횟수를 늘려 한 번 더 훑는다.

"간단한 정형 문서뿐이다" → 규칙 기반만으로도 충분할 수 있다.


개념 5 — 그래프 증강 (무리 짓기 + 숫자로 바꾸기)

망가지는 장면

점이 수만 개가 됐습니다.

"테슬라" 점을 찾으려고 수만 개를 하나하나 뒤집니다.

너무 느립니다.

비슷한 점끼리 미리 묶어 두지 않은 탓입니다.

일상비유

옷장 정리.

티셔츠·바지·양말을 섞어 두면 찾기 지옥입니다.

종류별 칸으로 묶어 두면(커뮤니티) 한 번에 찾습니다.

비유 코드(분위기) 위험
종류별 칸으로 묶기 커뮤니티 탐지(로우벤·레이든) 안 묶으면 검색 느림
옷에 일련번호 붙이기 그래프 임베딩(Node2vec) 숫자 없으면 시각화·계산 X

증강은 두 방향입니다.

(1) 커뮤니티 탐지 — 무리 짓기.

빽빽하게 얽힌 점들을 자동으로 무리로 묶습니다.

대표 알고리즘 둘.

로우벤(Louvain) — '모듈성'(무리 안은 빽빽, 밖은 듬성)이 높아지게 묶음. 빠르고 간단. 단 가끔 서로 안 이어진 점이 한 무리로 묶이고, 결과가 들쭉날쭉.

레이든(Leiden) — 2018년 나온 로우벤 개선판. 무리가 항상 이어진 상태를 보장하고, 정제 단계로 더 정확. 마이크로소프트 GraphRAG가 이걸 씁니다.

마이크로소프트는 레이든으로 계층 무리(Level 0~2)를 만듭니다.

Level 0은 포괄적('전기차 산업'), Level 2는 세부적('테슬라 공장 현황').

질문이 넓으면 위 레벨, 좁으면 아래 레벨을 골라 토큰을 아낍니다.

(2) 그래프 임베딩 — 숫자로 바꾸기.

점·선 그림을 숫자 묶음(0장 '벡터' 참고)으로 바꿉니다.

대표 기법 Node2vec: 점 주변을 무작위로 걸어 다니며(랜덤워크) 자주 함께 나오는 이웃을 그 점의 특징으로 삼습니다.

걷는 성향은 두 손잡이로 조절합니다.

  • p(귀환) — 작으면 왔던 점으로 잘 돌아감.
  • q(폭/깊이) — q>1이면 주변을 넓게(BFS), q<1이면 멀리(DFS).

한 문장 정의 — 그래프 증강은 점들을 무리(커뮤니티)로 묶고, 그래프를 숫자(임베딩)로 바꿔 검색·계산이 쉬워지게 하는 단계다.

예시 폭격

예시 ①(완성 — 무리 짓기). 점: 애플·아이폰·맥북·구글·안드로이드·픽셀.

→ '애플 제품' 무리 {애플, 아이폰, 맥북}, '구글 제품' 무리 {구글, 안드로이드, 픽셀}.

예시 ②(부분 완성 — 레벨 고르기). 질문 "테슬라 전반 현황은?"(넓음) → Level ( ㉠ ).

질문 "테슬라 신규 공장은?"(좁음) → Level ( ㉡ ).

정답 ㉠ 위(포괄, 예 Level 1) / ㉡ 아래(세부, 예 Level 2)

예시 ③(독립 적용). p를 작게, q를 크게(q=2) 두면 랜덤워크는 어떻게 걸을까요?

답: 왔던 점으로 잘 돌아오면서(p 작음), 주변 이웃을 넓게(BFS, q>1) 훑음.

미니 시나리오

"로우벤 결과가 매번 달라 불안하다" → 연결성을 보장하는 레이든으로 바꾼다.

"그래프를 그림으로 보고 싶다" → 임베딩(숫자)이 있어야 좌표를 찍을 수 있다(그래서 임베딩 설정을 켠다).

한 걸음 더 ▸ (지금 몰라도 됨)

숫자로 바꾼 점들을 화면에 점으로 찍으려면 차원 축소가 필요합니다. 수백 개 숫자를 x·y 두 개로 줄여 평면에 배치하는 거죠. 마이크로소프트는 UMAP이라는 기법을 씁니다. 가까운 점은 화면에서도 가깝게 놓입니다. 지금은 "그림으로 보려고 숫자를 줄이는구나" 정도면 충분합니다.


개념 6-1 — 로컬 검색 vs 글로벌 검색

망가지는 장면

그래프는 다 만들었습니다.

이제 질문이 들어옵니다.

"테슬라 CEO가 누구야?"(콕 집은 질문)와 "이 책 전체 주제가 뭐야?"(전체 질문).

두 질문을 똑같은 방식으로 처리하면 한쪽이 망합니다.

콕 집은 질문에 전체를 훑으면 느리고, 전체 질문에 한 점만 보면 부실합니다.

일상비유

도서관에서 책 찾기 vs 서가 전체 주제 묻기.

"이 책 어디 있어요?"는 사서가 짚어 줍니다(로컬).

"이 서가 전체가 뭘 다뤄요?"는 여러 책을 훑어 요약해 줘야 합니다(글로벌).

비유 코드(분위기) 위험
콕 집어 찾기 --method local 넓은 질문엔 부실
서가 전체 요약 --method global 좁은 질문엔 느리고 과함

로컬 검색 — 질문과 가까운 을 찾고, 그 점에 딸린 정보를 모아 답합니다.

세 단계입니다.

  1. 질문을 숫자로 바꿔 점들과 비교 → 관련 점 찾기.
  2. 그 점에 딸린 5가지를 모음: 텍스트 청크 / 커뮤니티 요약 / 이웃 점 / 관계 / 주장.
  3. 그중 진짜 관련된 것만 골라(리랭킹) 답을 만듦.

글로벌 검색 — 무리 요약들을 전부 훑어 전체 답을 만듭니다.

맵-리듀스 방식입니다.

  • 맵(Map) — 무리 요약을 잘게 나눠 LLM에 넣고, 각각 중간 답중요도 점수를 매김.
  • 리듀스(Reduce) — 점수 높은 중간 답만 골라 하나로 합쳐 최종 답을 만듦.

한 문장 정의 — 콕 집은 질문은 로컬(점 중심), 전체를 꿰는 질문은 글로벌(무리 요약 맵-리듀스)이다.

예시 폭격

예시 ①(완성 — 로컬 5가지). 질문 "테슬라 판매량은?" → '테슬라' 점 발견 → 딸린 정보 수집:

텍스트 청크(판매량 언급 문단) / 커뮤니티 요약('전기차' 무리) / 이웃 점(일론 머스크·Model S) / 관계 / 주장(점유율 하락).

예시 ②(부분 완성 — 글로벌 맵-리듀스). "이 문서 주요 주제는?"

맵: 각 무리 요약 → 중간 답 + ( ㉠ ).

리듀스: 점수 ( ㉡ ) 답만 골라 합침.

정답 ㉠ 중요도 점수 / ㉡ 높은

예시 ③(독립 적용). 질문 "산업채권 평가 시 순유동자산 분석법은?"(세부) → 로컬·글로벌 중?

답: 로컬. 특정 섹션의 구체적 방법이 필요하므로 점 중심 수집이 유리.

미니 시나리오

"전체 흐름·트렌드가 궁금하다" → 글로벌.

"특정 인물·제품의 세부 사실이 궁금하다" → 로컬.


개념 6-2 — Neo4j + 랭체인으로 굴리기

망가지는 장면

힘들게 만든 그래프가 코랩 런타임이 꺼지자 증발했습니다.

게다가 그래프를 쓰려면 매번 "이런 점 찾아줘"를 손으로 Cypher로 적어야 합니다.

비전문가에겐 벽입니다.

일상비유

임시 화이트보드 vs 영구 캐비닛.

그래프를 화이트보드에 그리면 지워집니다.

Neo4j라는 전용 캐비닛에 옮겨 담으면 영구 보관됩니다.

그리고 GraphCypherQAChain통역사입니다. 우리가 한국어로 물으면 Cypher로 번역해 캐비닛에 물어봐 줍니다.

비유 코드(분위기) 위험
전용 캐비닛에 보관 Neo4j에 점·선 임포트 안 옮기면 꺼질 때 증발
통역사가 대신 물음 GraphCypherQAChain 통역 없으면 직접 Cypher 작성

흐름은 이렇습니다.

마이크로소프트 GraphRAG가 만든 결과 파일을 → Neo4j에 옮겨 담고 → 랭체인으로 말로 물어봅니다.

옮길 때는 제약 조건을 먼저 걸어 중복을 막고, 데이터가 많으면 배치(한 묶음씩)로 나눠 넣습니다.

말로 묻는 부분이 핵심입니다.

# 자연어 질문 → 자동으로 Cypher 번역 → Neo4j 실행 → 답
# 준비한 흐름에 실제 입력을 넣어 결과를 확인합니다.
result = chain.invoke({"query": "테슬라와 관련된 주요 인물은?"})
# 통역사가 속으로 만든 Cypher(분위기만):
# MATCH (테슬라)-[:관계]-(사람)  WHERE 사람.타입='PERSON'  RETURN 사람

한 문장 정의 — Neo4j는 점·선을 영구 보관하는 그래프 창고, GraphCypherQAChain은 말을 Cypher로 자동 번역해 묻게 해 주는 통역사다.

예시 폭격

예시 ①(완성 — 통역). 사람: "일론 머스크와 이어진 회사 알려줘."

통역사가 Cypher로 바꿔 Neo4j에 물어보고, 결과를 다시 사람 말로 답해 줍니다.

예시 ②(부분 완성 — 중복 막기). 같은 점이 두 번 들어가는 걸 막으려면, 임포트 전에 ( ㉠ )을 건다.

데이터가 많으면 한꺼번에 말고 ( ㉡ )로 나눠 넣는다.

정답 ㉠ 제약 조건(고유 조건) / ㉡ 배치(묶음)

예시 ③(독립 적용). 코랩에서 만든 그래프를 다음에도 쓰려면?

답: Neo4j(또는 구글 드라이브)에 옮겨 저장. 코랩 런타임은 꺼지면 데이터가 사라지므로.

미니 시나리오

"매번 다시 만들기 싫다" → Neo4j에 영구 저장한다.

"Cypher를 못 짠다" → GraphCypherQAChain으로 말로 묻는다.

한 걸음 더 ▸ (지금 몰라도 됨)

랭체인에는 문서를 넣으면 자동으로 점·선을 뽑아 주는 LLMGraphTransformer도 있습니다. 별도 GraphRAG 파이프라인 없이 랭체인만으로 그래프를 만들 수 있죠. 또 글로벌 검색은 직접 맵-리듀스 함수로 구현할 수도 있습니다. 지금은 "도구가 더 있구나" 정도면 충분합니다.


정리

핵심 3줄.

그래프 RAG는 비슷한 조각 찾기를 넘어 연결된 점 따라가기로, 기존 RAG의 연결·전체 그림 한계를 메운다.

그래프 DB는 자르기 → 점·선 뽑기 → 무리 짓고 숫자로 → 무리 요약, 4단계로 만든다.

질문이 콕 집으면 로컬(점 중심), 전체를 꿰면 글로벌(무리 요약 맵-리듀스)을 쓰고, Neo4j+랭체인으로 영구 보관·자연어 질의한다.


단순 규칙

  • "관계·전체 패턴이 궁금하다" → 그래프 RAG. "비슷한 문단만 찾으면 된다" → 기존 RAG.
  • 점 많이 잡기 = 작은 청크(비용 ↑). 비용 아끼기 = 큰 청크 + Gleaning.
  • 콕 집은 질문 = 로컬. 전체 주제 질문 = 글로벌.
  • 그래프를 다음에도 쓰려면 Neo4j에 저장. Cypher 못 짜면 GraphCypherQAChain.

더 해보기

검증된 공식 자료와 실습(생존 확인 2026-05-21).

최신 동향(검증 2026-05-21): 책의 GraphCypherQAChain은 이제 langchain-neo4j 파트너 패키지로 옮겨졌습니다(from langchain_neo4j import GraphCypherQAChain). 모델명·패키지 위치는 수시로 바뀌니 위 공식 문서로 확인하세요.


다음 장 예고 — 다음 장에서는 또 다른 RAG 응용을 본다. 지금은 "그래프 RAG = 점 잇기"만 들고 가면 충분하다. (지금 몰라도 됩니다.)


연습문제

  1. 설명. 점 잇기 RAG의 핵심을 처음 듣는 사람에게 한 문장으로 설명하라.
  2. 구분. 두 개념(벡터 검색, 그래프 검색)을 실제 예시 하나로 구분하라.
  3. 적용. 내 프로젝트나 학습 노트에서 이 장의 개념을 적용해 작게 개선할 지점을 하나 고르라.

부록 A. 쉬운 용어 사전

용어 아주 쉬운 뜻 이 장에서 나온 위치
벡터 검색 문장의 뜻을 숫자로 바꿔 가까운 자료를 찾는 방식. 부록 B와 본문 예시
그래프 검색 점과 선으로 연결된 관계를 따라가며 자료를 찾는 방식. 부록 B와 본문 예시
로컬 검색 가까운 주변 정보만 좁게 살피는 검색. 부록 B와 본문 예시
글로벌 검색 전체 묶음의 흐름이나 요약을 넓게 보는 검색. 부록 B와 본문 예시

부록 B. 헷갈리는 개념 비교표

A B 구분 포인트
벡터 검색 그래프 검색 벡터는 뜻의 가까움을 보고, 그래프는 관계의 길을 본다.
로컬 검색 글로벌 검색 로컬은 가까운 주변을 보고, 글로벌은 전체 흐름을 요약한다.

부록 C. 더 읽을 자료

  • 이 장의 더 해보기 섹션 — 이미 모아 둔 공식 문서나 실습 링크가 있으면 여기서 먼저 확인한다.
  • 같은 책의 0장 한눈에 보기 — 용어가 막히면 0장의 용어집과 개념 척추로 돌아간다.
  • 원본 딥다이브판 같은 장 — 입문판을 읽고 큰 흐름이 잡힌 뒤 세부 논리를 더 깊게 확인한다.
  • 이 장의 flashcards.json — 읽은 직후 질문만 보고 답을 떠올리는 회상 연습에 쓴다.

부록 D. 연습문제 풀이

  1. 설명 예시. 점 잇기 RAG는 RAG에서 자료를 더 잘 찾고, 근거를 더 안전하게 붙이고, 답변 흐름을 더 다루기 쉽게 만드는 방법을 보는 장이다. 중요한 것은 용어를 외우는 것이 아니라, 이 개념이 어떤 입력·부품·결정에 영향을 주는지 말로 풀어 보는 것이다.
  2. 구분 예시. 두 개념(벡터 검색, 그래프 검색)의 차이는 이렇게 잡으면 된다. 벡터는 뜻의 가까움을 보고, 그래프는 관계의 길을 본다. 실제 사례를 볼 때는 목적, 입력, 실패했을 때의 증상을 따로 적어 보면 헷갈리지 않는다.
  3. 적용 예시. 가장 작은 개선부터 고른다. 예를 들어 이름을 더 분명히 하거나, 평가 기준을 한 줄 추가하거나, 직접 알 필요 없는 내부 정보를 감추는 식으로 시작한다. 한 번에 크게 갈아엎는 것보다 작은 변경 하나를 확인하며 진행하는 쪽이 입문 단계에 맞다.
난이도
에피소드
질문
카드를 로딩 중...
답변

클릭하거나 Space를 눌러 뒤집기

0 / 0
학습 진도 0%
이동   Space 뒤집기   R 셔플